/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.folha.dao;

import br.com.folha.controller.LoginController;
import br.com.folha.entity.Professor;
import br.com.folha.entity.ProfessorUnidadeTipologia;
import br.com.folha.entity.Unidade;
import br.com.folha.utilidades.HibernateUtil;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;


/**
 *
 * @author marceloml
 */
public class ProfessorDao implements Serializable{
    
    private static final long serialVersionUID = 1L;    
    private HashMap<String, Integer> unidades; 
    
    public List<Professor> ConsultaCPFProfessor(String cpf){
        Session sessao = HibernateUtil.getSessionFactory();
        
        Criteria criteria = sessao.createCriteria(Professor.class);
                 criteria.createAlias("professorUnidadeTipologia", "p");
                 criteria.add(Restrictions.eq("cpf", cpf));                 
                 
        List lista = criteria.list();   
        
        sessao.close();
        return lista;                        
    }    
    
    /*
     * Esta consulta filtrará os professores ativos e que pertençam as mesmas 
     * unidades que o usuário logado
     */
    
    public List<Object> listaProfessorAtivo(Class t){
        Session sessao = HibernateUtil.getSessionFactory();
        LoginController login = new LoginController();
        Criteria criteria = sessao.createCriteria(t).add(Restrictions.eq("ativo", true));
        criteria.createAlias("professorUnidadeTipologia", "p");
        criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 
        criteria.setFetchMode("p.professorUnidadeTipologia", FetchMode.SELECT);
                        
        List<Unidade> integerArray = new ArrayList<Unidade>();
        
        for (Iterator iterator = login.Usuario.getUnidades().iterator(); iterator.hasNext();){
            
            Unidade unidade = (Unidade) iterator.next();                     
            
            integerArray.add(unidade);
        
        }        
        
        criteria.add(Restrictions.in("p.unidade", integerArray));
        criteria.addOrder(Order.asc("nome"));
        List lista = criteria.list();        
        sessao.close();
        return lista;                        
    }

    /*
     * Esta consulta filtrará os professores que pertençam as mesmas 
     * unidades que o usuário logado
     */    
    
    public List<Object> listaProfessor(Class t){
        Session sessao = HibernateUtil.getSessionFactory();
        LoginController login = new LoginController();
        Criteria criteria = sessao.createCriteria(t);
        criteria.createAlias("professorUnidadeTipologia", "p");
        criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);        
        criteria.setFetchMode("p.professorUnidadeTipologia", FetchMode.SELECT);
                        
        List<Unidade> integerArray = new ArrayList<Unidade>();
        
        for (Iterator iterator = login.Usuario.getUnidades().iterator(); iterator.hasNext();){
            
            Unidade unidade = (Unidade) iterator.next();                     
            
            integerArray.add(unidade);
        
        }        
        
        criteria.add(Restrictions.in("p.unidade", integerArray));       
        criteria.addOrder(Order.asc("nome"));
        List lista = criteria.list();        
        sessao.close();
        return lista;                        
    }    
    
    /*
     * Esta consulta filtrará os professores ativos e que pertençam as mesmas 
     * a unidade informada pelo usuário e será usada na tela de Grade Horária
     */
    
    public List<Object> listaProfessorAtivoUnidade(Unidade unidade){
        Session sessao = HibernateUtil.getSessionFactory();
        
        Criteria criteria = sessao.createCriteria(Professor.class).add(Restrictions.eq("ativo", true));
        criteria.createAlias("professorUnidadeTipologia", "p");
        criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 
        criteria.setFetchMode("p.professorUnidadeTipologia", FetchMode.SELECT);      
        
        criteria.add(Restrictions.eq("p.unidade", unidade));        
        List lista = criteria.list();        
        sessao.close();
        return lista;                        
    }    
    
    public Professor getById(int id)
    { 
       Session sessao = HibernateUtil.getSessionFactory();
       Query query = sessao.createQuery("FROM Professor WHERE id = :id");               
       query.setParameter("id", id);        

       return (Professor) query.uniqueResult();
    }
    
    public Integer ultimoSeq(){
       Session sessao = HibernateUtil.getSessionFactory();
       Query query = sessao.createQuery("select MAX(id) from Professor");       

       return (Integer) query.uniqueResult();        
    }
    
}